Control Towerのリージョン拒否コントロール(Region deny control)を設定してみる
はじめに
こんにちは、和田です。
この記事ではControl Towerの機能の1つであるリージョン拒否コントロール(Region deny control)についてまとめます。
リージョン拒否コントロール(Region deny control)とは
リージョン拒否コントロール(Region deny control)とは、Control Towerの機能の1つで、ホームリージョンおよびランディングゾーンリージョン以外でのAPI実行を禁止するものです。
ランディングゾーン全体に適用されるため、Control Towerに登録されたOUの中で例外を作ることはできません。
リージョン拒否コントロールの実態は、Control Towerに登録されたOUに対して、特定のリージョン以外への操作を禁止するSCPを自動で付与するものです。グローバルリソースへの例外設定などもいい感じに設定してくれているので、利用者として設計時の考慮事項が減って嬉しい限りです。
リージョン拒否コントロール有効化時に付与されるSCP
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GRREGIONDENY",
"Effect": "Deny",
"NotAction": [
"a4b:*",
"access-analyzer:*",
"account:*",
"acm:*",
"activate:*",
"artifact:*",
"aws-marketplace-management:*",
"aws-marketplace:*",
"aws-portal:*",
"billing:*",
"billingconductor:*",
"budgets:*",
"ce:*",
"chatbot:*",
"chime:*",
"cloudfront:*",
"cloudtrail:LookupEvents",
"compute-optimizer:*",
"config:*",
"consoleapp:*",
"consolidatedbilling:*",
"cur:*",
"datapipeline:GetAccountLimits",
"devicefarm:*",
"directconnect:*",
"ec2:DescribeRegions",
"ec2:DescribeTransitGateways",
"ec2:DescribeVpnGateways",
"ecr-public:*",
"fms:*",
"freetier:*",
"globalaccelerator:*",
"health:*",
"iam:*",
"importexport:*",
"invoicing:*",
"iq:*",
"kms:*",
"license-manager:ListReceivedLicenses",
"lightsail:Get*",
"mobileanalytics:*",
"networkmanager:*",
"notifications-contacts:*",
"notifications:*",
"organizations:*",
"payments:*",
"pricing:*",
"quicksight:DescribeAccountSubscription",
"resource-explorer-2:*",
"route53-recovery-cluster:*",
"route53-recovery-control-config:*",
"route53-recovery-readiness:*",
"route53:*",
"route53domains:*",
"s3:CreateMultiRegionAccessPoint",
"s3:DeleteMultiRegionAccessPoint",
"s3:DescribeMultiRegionAccessPointOperation",
"s3:GetAccountPublicAccessBlock",
"s3:GetBucketLocation",
"s3:GetBucketPolicyStatus",
"s3:GetBucketPublicAccessBlock",
"s3:GetMultiRegionAccessPoint",
"s3:GetMultiRegionAccessPointPolicy",
"s3:GetMultiRegionAccessPointPolicyStatus",
"s3:GetStorageLensConfiguration",
"s3:GetStorageLensDashboard",
"s3:ListAllMyBuckets",
"s3:ListMultiRegionAccessPoints",
"s3:ListStorageLensConfigurations",
"s3:PutAccountPublicAccessBlock",
"s3:PutMultiRegionAccessPointPolicy",
"savingsplans:*",
"shield:*",
"sso:*",
"sts:*",
"support:*",
"supportapp:*",
"supportplans:*",
"sustainability:*",
"tag:GetResources",
"tax:*",
"trustedadvisor:*",
"vendor-insights:ListEntitledSecurityProfiles",
"waf-regional:*",
"waf:*",
"wafv2:*"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:RequestedRegion": []
},
"ArnNotLike": {
"aws:PrincipalARN": [
"arn:aws:iam::*:role/AWSControlTowerExecution"
]
}
}
}
]
}
これとよく似た概念で、OUに適用されたリージョン拒否コントロール(Region deny control applied to the OU)というものもありますが、この記事では説明を割愛します。詳しくはこちらのブログを参照ください。
リージョン制限のメリット
AWSでは約30個のリージョンが利用可能です。
世界中の多くの地域にリソースを作れるのは嬉しい反面、それらを全て管理するのは困難です。
セキュリティ面では「悪意のある第三者への不正アクセスを許し、リソースを起動された」という場合、作成先が普段使わないリージョンだと発見が遅れるリスクがあります。
コスト面でも、「検証用に誤って別リージョンに作成したリソースが、誰にも気づかれず削除されることもなく利用費を払い続けていた」なんてことが起こるかもしれません。
使う予定のないリージョンへの操作をあらかじめ制限しておくことで、こういったリスクを軽減できます。
注意点
前述の通り、リージョン拒否コントロールを有効にすると指定したリージョン以外でのAPI操作を禁止されます。
したがって、有効にする前に作成したリソースがあった場合に削除することができません。
リージョン拒否コントロールを有効にする前に、制限されるリージョンにリソースがないことを確認しましょう!
やってみる
リージョン拒否コントロールはControl Tower有効化時でも、有効化したあとでも設定が可能です。
今回はあらかじめControl Towerを有効化した環境でリージョン拒否コントロールを有効にしていこうと思います。
まずはリージョン拒否コントロールを有効にしたい環境の管理アカウントにログインし、「Control Tower」のコンソールを開きます。
サイドタブから「ランディングゾーン設定」をクリックします。
ランディングゾーン設定の「設定を変更する」をクリックします。
「リージョン拒否設定」の「有効」をクリックします。
それ以外の項目は変更せず、「ランディングゾーンの更新」をクリックします。
ランディングゾーンの更新には30ほどかかるので待ちます。
「リージョン拒否コントロール」のステータスが有効になっていれば、設定完了です。
確認
今回の環境では以下のリージョンを設定しているので、それ以外のリージョンに切り替えて検証します。
- ホームリージョン:東京
- 追加リージョン:大阪、バージニア、オレゴン
メンバーアカウントにログインし、ロンドンリージョンに切り替えてみます。
「EC2」のコンソールを開くと、、、
ガッツリ拒否されてそうですね。
補足
前述の通り、リージョン拒否コントロールはControl Towerに登録されたOUに対してSCPを付与する仕組みのため、管理アカウントへのリージョン制限はされません。
最後に
今回はControl Towerのリージョン拒否コントロールについてまとめてみました。
どなたかのお役に立てれば幸いです。